Comparable과 Comparator 인터페이스
✒️ 2025-05-30 09:12 내용 수정
1. Comparable 인터페이스
객체를 정렬하는데 사용되는 메서드인 compareTo() 메서드를 정의하는 인터페이스
- 참고 자료 : Oracle Comparable Interface
- 자연 순서(natural ordering)를 정의하기 위해 사용하는 인터페이스다.
- boolean을 제외한 Wrapper 클래스, String, Time, Date와 같은 클래스의 인스턴스는 모두 정렬 가능하다.
- 기본 정렬 순서는 오름차순이다.
| 메서드 | 설명 |
|---|---|
int compareTo(T o) |
해당 객체와 전달된 객체의 순서를 비교함 |
- 필드를 이용하여 오름차순
compareTo()메서드 만들기
public class Test implements Comparable<Test> {
private int id;
public Test(int id) {
this.id = id;
}
@Override
public int compareTo(Test t) {
// 오름차순 정렬
return Integer.compare(this.id, t.id);
// 또는
// return this.id - t.id;
}
}
- 필드를 이용하여 내림차순
compareTo()메서드 만들기
public class Test implements Comparable<Test> {
public int id;
@Override
public int compareTo(Test t) {
// 내림차순 정렬
return Integer.compare(t.id, this.id);
// 또는 - 기호로 표시
//return -Integer.compare(this.id, t.id);
}
}
예시
public class Video implements Comparable<Video> {
private String title;
private int views;
public Video(String title, int views) {
this.title = title;
this.views = views;
}
@Override
public int compareTo(Video v1) {
// 오름차순 정렬
return Integer.compare(this.views, v1.views);
}
@Override
public String toString() {
return title + " : " + views +"회";
}
public int getViews() {
return views;
}
}
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Video> list = Arrays.asList(
new Video("a", 200),
new Video("b", 94732),
new Video("c", 1432),
new Video("d", 203),
new Video("e", 87332)
);
System.out.println(list);
// compareTo를 사용한 오름차순 정렬
Collections.sort(list);
System.out.println(list);
}
[a : 200회, b : 94732회, c : 1432회, d : 203회, e : 87332회]
[a : 200회, d : 203회, c : 1432회, e : 87332회, b : 94732회]
2. Comparator 인터페이스
Comparable 인터페이스와 같이 객체를 정렬하는데 사용되는 인터페이스
- comparable 인터페이스를 구현한 클래스는 기본적으로 오름차순으로 정렬되지만, comparable 인터페이스를 구현하면 내림차순이나 다른 정렬 기준으로 정렬할 수 있다.
- 람다식을 사용해서 원하는 기준으로 정렬할 수 있게 만들 수 있다.
- 정렬 시 정렬 기준이 외부에 드러나기 때문에 정렬 기준을 숨기고 싶다면
Comparable의 메서드 상속 방법을 추천한다.
| 메서드 | 설명 |
|---|---|
int compareTo(T o1, T o2) |
전달된 두 객체의 순서를 비교함 |
boolean equals(Object obj) |
해당 comparator와 전달된 객체가 같은지 확인 |
default Comparator<T> reversed() |
해당 comparator의 역순인 comparator를 반환 |
static <T extends Comparable<? super T>> Comparator<T> reversedOrder() |
자연 순서(natural ordering)의 역순 comparator를 반환 |
default Compartor<T> thenComparing(Comparator<? super T> other) |
Comparable 정렬 키를 추출하는 함수를 사용하여 사전식 순서 comparator를 반환정렬을 진행한 후 추가 정렬을 진행하는 경우에 사용 |
예시
public class Video implements Comparable<Video> {
private String title;
private int views;
public Video(String title, int views) {
this.title = title;
this.views = views;
}
@Override
public int compareTo(Video v1) {
// 오름차순 정렬
return Integer.compare(this.views, v1.views);
}
@Override
public String toString() {
return title + " : " + views +"회";
}
public int getViews() {
return views;
}
public String getTitle() {
return title;
}
}
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Video> list = Arrays.asList(
new Video("A Test", 200),
new Video("Code", 94732),
new Video("November Playlist", 1432),
new Video("Description", 203),
new Video("오늘의 날씨", 87332),
new Video("뉴스", 94732),
new Video("New 주간 신작 영화", 1432)
);
System.out.println("조회수 내림차순");
list.sort(Comparator.comparing((Video v)-> -v.getViews()));
for(Video v : list) {
System.out.println(v.toString());
}
System.out.println();
System.out.println("제목 오름차순");
list.sort(Comparator.comparing((Video v)-> v.getTitle()));
for(Video v : list) {
System.out.println(v.toString());
}
System.out.println();
System.out.println("조회수 내림차순 + 제목 오름차순");
list.sort(
Comparator.comparing((Video v)-> -v.getViews())
.thenComparing((Video v)-> v.getTitle())
);
for(Video v : list) {
System.out.println(v.toString());
}
}
조회수 내림차순
Code : 94732회
뉴스 : 94732회
오늘의 날씨 : 87332회
November Playlist : 1432회
New 주간 신작 영화 : 1432회
Description : 203회
A Test : 200회
제목 오름차순
A Test : 200회
Code : 94732회
Description : 203회
New 주간 신작 영화 : 1432회
November Playlist : 1432회
뉴스 : 94732회
오늘의 날씨 : 87332회
조회수 내림차순 + 제목 오름차순
Code : 94732회
뉴스 : 94732회
오늘의 날씨 : 87332회
New 주간 신작 영화 : 1432회
November Playlist : 1432회
Description : 203회
A Test : 200회